﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.Instance;
using l1cs.server.model;
using l1cs.server.serverpackets;

namespace l1cs.server.clientpackets
{
    public class C_CreateParty : ClientBasePacket
    {
        private const String _C_CREATE_PARTY = "[C] C_CreateParty";
        private static Logger _log = Logger.getLogger( typeof( C_CreateParty ).FullName );

        public C_CreateParty( byte[] decrypt, ClientThread client )
            : base( decrypt )
        {
            L1PcInstance pc = client.getActiveChar();

            int type = readC();
            if ( type == 0 || type == 1 )
            { // パーティー(パーティー自動分配ON/OFFで異なる)
                int targetId = readD();
                L1Object temp = L1World.getInstance().findObject( targetId );
                if ( temp is L1PcInstance )
                {
                    L1PcInstance targetPc = (L1PcInstance)temp;
                    if ( pc.getId() == targetPc.getId() )
                    {
                        return;
                    }
                    if ( targetPc.isInParty() )
                    {
                        // すでに他のパーティーに所属しているため招待できません
                        pc.sendPackets( new S_ServerMessage( 415 ) );
                        return;
                    }

                    if ( pc.isInParty() )
                    {
                        if ( pc.getParty().isLeader( pc ) )
                        {
                            targetPc.setPartyID( pc.getId() );
                            // \f2%0\f>%sから \fUパーティー\f> に招待されました。応じますか？（Y/N）
                            targetPc.sendPackets( new S_Message_YN( 953, pc
                                    .getName() ) );
                        }
                        else
                        {
                            // パーティーのリーダーのみが招待できます。
                            pc.sendPackets( new S_ServerMessage( 416 ) );
                        }
                    }
                    else
                    {
                        targetPc.setPartyID( pc.getId() );
                        // \f2%0\f>%sから \fUパーティー\f> に招待されました。応じますか？（Y/N）
                        targetPc.sendPackets( new S_Message_YN( 953, pc.getName() ) );
                    }
                }
            }
            else if ( type == 2 )
            { // チャットパーティー
                String name = readS();
                L1PcInstance targetPc = L1World.getInstance().getPlayer( name );
                if ( targetPc == null )
                {
                    // %0という名前の人はいません。
                    pc.sendPackets( new S_ServerMessage( 109 ) );
                    return;
                }
                if ( pc.getId() == targetPc.getId() )
                {
                    return;
                }
                if ( targetPc.isInChatParty() )
                {
                    // すでに他のパーティーに所属しているため招待できません
                    pc.sendPackets( new S_ServerMessage( 415 ) );
                    return;
                }

                if ( pc.isInChatParty() )
                {
                    if ( pc.getChatParty().isLeader( pc ) )
                    {
                        targetPc.setPartyID( pc.getId() );
                        // \f2%0\f>%sから\fUチャットパーティー\f>に招待されました。応じますか？（Y/N）
                        targetPc.sendPackets( new S_Message_YN( 951, pc.getName() ) );
                    }
                    else
                    {
                        // パーティーのリーダーのみが招待できます。
                        pc.sendPackets( new S_ServerMessage( 416 ) );
                    }
                }
                else
                {
                    targetPc.setPartyID( pc.getId() );
                    // \f2%0\f>%sから\fUチャットパーティー\f>に招待されました。応じますか？（Y/N）
                    targetPc.sendPackets( new S_Message_YN( 951, pc.getName() ) );
                }
            }

        }

        override
        public String getType()
        {
            return _C_CREATE_PARTY;
        }
    }
}